{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets('./')\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 576x576 with 0 Axes>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 576x576 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx + 1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder('float', [None, 784])\n",
    "y = tf.placeholder('int64', [None])\n",
    "\n",
    "learning_rate = tf.placeholder('float')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def initialize(shape, stddev=0.1):\n",
    "    return tf.truncated_normal(shape, stddev=0.1)\n",
    "#1. 隐层中的神经元个数\n",
    "L1_units_count = 100\n",
    "\n",
    "W_1 = tf.Variable(initialize([784, L1_units_count]))\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))\n",
    "logits_1 = tf.matmul(x, W_1) + b_1\n",
    "#将乘积数据激活函数，激活函数为ReLU\n",
    "output_1 = tf.nn.relu(logits_1)\n",
    "\n",
    "#2. 神经网络输出节点 ，共10个输出点\n",
    "L2_units_count = 10\n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2\n",
    "\n",
    "logits = logits_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#定义loss和用于优化网络的优化器 loss计算使用了#sparse_softmax_cross_entropy_with_logits,这样做的好处\n",
    "#是labels可以不用手动#做one_hot省了一些麻烦。这里使用sgd优化器，学习率可以根据需要设定\n",
    "#拓展--可以尝试增大学习率，换个优化器再进行训练\n",
    "cross_entropy_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#softmax概率分类\n",
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#saver用于保存或恢复训练的模型\n",
    "batch_size = 32\n",
    "trainig_step = 1000\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.343405, the validation accuracy is 0.891\n",
      "after 200 training steps, the loss is 0.268626, the validation accuracy is 0.8902\n",
      "after 300 training steps, the loss is 0.23175, the validation accuracy is 0.9224\n",
      "after 400 training steps, the loss is 0.110849, the validation accuracy is 0.9346\n",
      "after 500 training steps, the loss is 0.140661, the validation accuracy is 0.9368\n",
      "after 600 training steps, the loss is 0.301867, the validation accuracy is 0.9402\n",
      "after 700 training steps, the loss is 0.143711, the validation accuracy is 0.939\n",
      "after 800 training steps, the loss is 0.425264, the validation accuracy is 0.9456\n",
      "after 900 training steps, the loss is 0.135332, the validation accuracy is 0.95\n",
      "the training is finish\n",
      "the test accuracy is: 0.9497\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    \n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "    \n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "        [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.3\n",
    "            }\n",
    "        )\n",
    "        \n",
    "        if i>0 and i%100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                  % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "            \n",
    "    print('the training is finish')\n",
    "\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print('the test accuracy is:', acc)            \n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-900\n",
      "0.944444\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n6eNtDNcgosEra3/xzE9Z/+M6usP5LdE6yudREhERheBN0YmIiEKwoSQiIgoRepbjwVkD2S+bIV8U\nvZmSi4C5TDMnFcuUyzNzuI7ufGItUx5REhERhWBDSUREFIINJRERUQg2lERERCHYUBIREYVgQ0lE\nRBSCDSUREVEINpREREQh2FASERGFYENJREQUgg0lERFRCDaUREREIdhQEhERhWBDSUREFIINJRER\nUQg2lERERCFCH9xcVhT2392PL372DSftqbZtUva560/e25muPXWlrdPs31L2uVRya87Yx5kef+9T\nftzpiQv9uMV9E5x8un17aiu2E8tp2dyPG45c48ffTO7k5OvwpE0rnD479RXzZDdo4EyvOtxuK+qM\nnOLHWlCQtjpR+cQjSiIiohBsKImIiEKUi67XPw7N9eO62RvS9rl/HbnVmd422O5X1D0qbdWgGHKa\n7uLHd9z8XMx8My560o8Pf3R/J03Xr09+xXZSOY0bOdO3jxnlx+0rFfnxAasaO/kKp89NbcUCgt2t\ng8ZOcdL2znvHjy/65V824afpKa9XeZddv54zPfuhFn7cr61dvov7bnPy7Szd2jyiJCIiCsGGkoiI\nKAQbSiIiohBldoxSKlX24wMOmJqROtT4Kc+ZPuncb/z469rNnLTCNWvTUieylh/a0o8PqbotZr7d\nJ53sxw02zElpnXY2Oc2a+nGtkZuctG6Vs/24/ZcX+HHbM92xwXSaeWe+H59U/VMnbfeHr/HjXX4a\nl64qlVvLL97Xj2+59GUn7ciqn0d9z7H1BzjT2xcvSX7FMoBHlERERCHYUBIREYUos12v64+zd+N5\ntOljftzx3YudfG0xPmV1KKijzvTQOrP8eEyNjm5mdr2mXFbVqs70oUPHxvW+3P/VsROqsTPSP6zu\nbe++827+EzHzdRy23I/Tea8j3ae7M/3bUc/4cd9fBjppzV+w629haqtVbmW3a+3Hz135sB/3qOw2\nFUWIbulTNZzpJv+ylwptX/pX4hXMEB5REhERhWBDSUREFIINJRERUYgyM0apvXs400/c94gfj1hn\nLwPoMMw9vT+VYw37HPJrCkunkirY1x0XvrPh8zHzbiqytx+s+dqPKavTzib4RBAAWHHMlph59/jP\nJX7c+M/0XW4RHJcc9upLMfNt+Mi9lV61VfNSVqedxczr7Hh+8PKfeI3v+ZozPecHux4e/8oVTtqu\n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\n4npPpTmLnenZ1+/qx7Vn2Pvq1p25xcmX9d1PpakiUbmxZUAvZ7rKJ1P8WPfo5Mfzj67m5Nv/gF/8\n+LuvusYsv8kPhX6c98GEUteT/ik4Ljnn2fZ+/G6DZ518RYH4z5+b+HFrcIySiIiowmFDSUREFKLC\ndL2uPX1vP151hNsdet1un/rxGTU/jqu859e2cKaPr/GOH9cZmBfzfUc17RlX+URlXXb9en5cOLKK\nH/+v7YNOvmWFlfy4VtYYP26RUxUxnfltzKTlp2/y4yWPVnbS/nX3pX5c778/xC6fopp3Y3c/ntH/\nUT8eNO9wJ9+qu1r5cetPf0x9xTKMR5REREQh2FASERGFKPddr1ndO/rxrEvsWXTfHfKwk69B9kT7\nniTsH5xba2HEK7G7W4l2RnMescMPszs8H0hxu1QbZtv4yTXt/HjKenf4YtHG2jE/K1vseZYftf8g\natkAMHLY//nxBTMvdtKyxk4FhdvacHvU16d919aZbvVpxerW5hElERFRCDaUREREIdhQEhERhSj3\nY5QbW9Xw4zmHPxVIqfLPzAl6eo29+86rf+xZqjJq4bdkVadCyOph7+SypbF7J5cFx9o7IJ3Ya6KT\ntk3t4NXXr9g7xTT5Zq2TT3+anpR6VgS6T3dneuS+zwSm7Kbk083uGOW9V5/pxzWmr7QJK/528mWt\n/jP2Z2fZ5dnugQv9eMZJjzn5Wleq7sebh61z0mqdZe/Atf2vZTE/qyKrVH2rH68vsnGLLwoyUZ0y\ng0eUREREIdhQEhERhSgzXa85zZo60zOvbebHjcbZLraar7t3gcgqUD+es812Ffy53T3VvHnOGj8+\n69cznbTVM+0dRhpNtOXVHud2BemGDX5caw27UJNFe/dwpuddZOPX9vmvH/esHHEtQLyutjfO3nzV\nVifp2TW2a/fJn/s6aW3PnenHRVvcuzlVRNtquXfB6VHZbj6KYNebq188x8nX/J1xflyIUiqy72xz\nud0GdKzsXgIy7ZhH/Pibrm85ab0Psl22tUaw6xUAstu0cqan93nBjy9dcqDN9/UUVGQ8oiQiIgrB\nhpKIiCgEG0oiIqIQGR2jzK5dy497fTTfSXu3/vt+3HuSOw4RlPuJvSzg6iPP8uPC6bPdz+pob8FU\nd/bvTlrdojlRy45+MycqraL97FjkAjtchI96P+Hka50TvLTHjkt+sdm95OeGGcf68ZqF7pj0r8fa\n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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "        [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16],\n",
    "                \n",
    "            }\n",
    "        )\n",
    "        \n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8,8))\n",
    "        print(acc)\n",
    "        \n",
    "        for idx in range(32):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx], \n",
    "                                                 order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "            \n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "invalid character in identifier (<ipython-input-31-7f79733b4396>, line 2)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;36m  File \u001b[0;32m\"<ipython-input-31-7f79733b4396>\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m    本模型是一个2层的全连接神经元网络，包含输入层、1个隐藏层、1个输出层。\u001b[0m\n\u001b[0m                                       ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid character in identifier\n"
     ]
    }
   ],
   "source": [
    "#1.对模型结构的理解\n",
    "本模型是一个2层的全连接神经元网络，包含输入层、1个隐藏层、1个输出层。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "invalid character in identifier (<ipython-input-32-b84370a9cf89>, line 4)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;36m  File \u001b[0;32m\"<ipython-input-32-b84370a9cf89>\"\u001b[0;36m, line \u001b[0;32m4\u001b[0m\n\u001b[0;31m    前向传播过程中通过权重与输入数值相乘累加，并通过激活函数得到输出值作为下一层的输入值，逐层计算得到最终的输出值。\u001b[0m\n\u001b[0m                                                           ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid character in identifier\n"
     ]
    }
   ],
   "source": [
    "#2.对模型训练过程（梯度如何计算，参数如何更新）的理解\n",
    "模型一次训练过程包括前向传播和反向传播\n",
    "\n",
    "前向传播过程中通过权重与输入数值相乘累加，并通过激活函数得到输出值作为下一层的输入值，逐层计算得到最终的输出值。\n",
    "\n",
    "反向传播过程的核心，是通过比较输出y和真值t，对参与计算的w进行调整。其计算方法是从网络的输出层开始，向输入层方向逐层计算梯度并更新权重，与前馈运算正好相反。首先计算输出节点的总误差，并将这些误差用反向传播算法传播回网络，以计算梯度。\n",
    "接下来，使用类似梯度下降之类的算法来调整网络中的所有权重，目的是减少输出层的误差。当计算一个节点的误差项时，需要先计算每个与其相连的下一层节点的误差项。这就要求误差项的计算顺序必须是从输出层开始，然后反向依次计算每个隐藏层的误差项，直到与输入层相连的那个隐藏层。\n",
    "当所有节点的误差项计算完毕后，就更新了所有的权重。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "invalid syntax (<ipython-input-33-c5f882b997fb>, line 2)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;36m  File \u001b[0;32m\"<ipython-input-33-c5f882b997fb>\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m    计算图主要由四个部分构成:\u001b[0m\n\u001b[0m                 ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
     ]
    }
   ],
   "source": [
    "#3.对计算图的理解\n",
    "计算图主要由四个部分构成:\n",
    "1、张量（Tensor）\n",
    "2、操作（Option）\n",
    "3、变量（Variable）\n",
    "4、会话（Session）\n",
    "\n",
    "在计算图计算或者张量的运算中，会经常使用一些方法来对数据进行操作,包括最简单的对元素的运算，对矩阵进行运算，定义常量，大量的神经元函数的操作以及保存模型的相关操作等。\n",
    "上图中包含的操作有placehold、Matmul、add、Relu、Softmax、ArgMax、Equal、Cast、Mean、Saver和Restore等。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#4.解释这⾥的模型为什么效果⽐较差\n",
    "神经网络模型只有一个隐藏层，神经元数目也较少，模型相对比较简单，而且训练轮次较少，所以模型效果比较差"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python_tf 3",
   "language": "python",
   "name": "tfkernel"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
